import type { Metadata } from 'next'; import Link from 'next/link'; import { notFound } from 'next/navigation'; import { ExternalLink } from 'lucide-react'; import { GraphLink } from '@/components/graph/graph-link'; import { PageHeader, Section, KV, Note } from '@/components/ui/section'; import { Badge, ClaimBadge } from '@/components/ui/badge'; import { EmptyState } from '@/components/ui/empty-state'; import { Freshness } from '@/components/ui/freshness'; import { SourceBadge, TableProvenance } from '@/components/ui/source-badge'; import { JsonView } from '@/components/ui/json-view'; import { Pager } from '@/components/ui/pager'; import { EvidenceTable } from '@/components/data/evidence-table'; import { getVariantBySlug, variantAliases, clinicalSignificanceFor } from '@/lib/queries/genomics'; import { evidenceForVariant, evidenceForVariantCount, EVIDENCE_PAGE_SIZE } from '@/lib/queries/evidence'; import { loadProvenance, toInfo } from '@/lib/queries/provenance'; import { fmtInt, humanize } from '@/lib/format'; import { pageInfo } from '@/lib/pagination'; import { int, type SP } from '@/lib/search-params'; export const revalidate = 3600; export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise { const v = await getVariantBySlug((await params).slug); return v ? { title: `${v.gene_symbol ? `${v.gene_symbol} ` : ''}${v.name} — variant`, description: `Curated evidence by cancer and ClinVar interpretations for ${v.gene_symbol ?? ''} ${v.name}.`, alternates: { canonical: `/variant/${v.slug}` } } : { title: 'Variant' }; } const CLINVAR = { sourceSlug: 'clinvar', sourceName: 'ClinVar' }; export default async function VariantPage({ params, searchParams }: { params: Promise<{ slug: string }>; searchParams: Promise }) { const { slug } = await params; const v = await getVariantBySlug(slug); if (!v) notFound(); const sp = await searchParams; const evTotal = await evidenceForVariantCount(v.id); const ev = pageInfo(int(sp, 'evPage', 1, 1, 100_000), EVIDENCE_PAGE_SIZE, evTotal); const [aliases, evidence, clinsig] = await Promise.all([variantAliases(v.id), evTotal ? evidenceForVariant(v.id, { page: ev.page, pageSize: ev.pageSize }) : Promise.resolve([]), clinicalSignificanceFor(v.id)]); const prov = await loadProvenance([...evidence.map((e) => e.provenance_id), ...clinsig.map((c) => c.provenance_id)]); // Evidence grouped by cancer (§50) — the query orders by cancer, so groups are contiguous within a page. const contexts = new Set(evidence.map((e) => e.cancer_id ?? `unmapped:${e.disease_name ?? 'unknown'}`)).size; const hrefFor = (p: number) => `/variant/${v.slug}${p > 1 ? `?evPage=${p}` : ''}#evidence`; const clinProv = clinsig[0] ? (toInfo(prov.get(clinsig[0].provenance_id)) ?? CLINVAR) : CLINVAR; return (
{v.gene_symbol ? {v.gene_symbol} : null} {v.name}}>

{v.id} {v.hgvs_p ? {v.hgvs_p} : null} {v.hgvs_c ? {v.hgvs_c} : null} {v.clinvar_variation_id ? ( ClinVar {v.clinvar_variation_id} ) : null} {v.civic_variant_id ? ( CIViC {v.civic_variant_id} ) : null} {v.dbsnp_ids.map((r) => ( {r} ))}

{evidence.length ? ( <> Showing {fmtInt(ev.from)}–{fmtInt(ev.to)} of {fmtInt(evTotal)} evidence items across {contexts} cancer context{contexts === 1 ? '' : 's'} on this page } /> ) : ( No curated evidence item references this variant yet. )}
{clinsig.length ? ( <> }> {clinsig.length} interpretation{clinsig.length === 1 ? '' : 's'} · review status and star rating as assigned by ClinVar.
{clinsig.map((c) => ( ))}
Variation Clinical significance Review status Stars Conditions Origin Submitters Last evaluated Source
{c.clinvar_variation_id} {c.clinical_significance} {c.review_status ?? '—'} {c.star_rating ?? '—'} {c.conditions.join('; ') || '—'} {c.origin_simple ?? '—'} {c.number_submitters ?? '—'} {c.last_evaluated ?? '—'}
) : ( No ClinVar interpretation attached to this variant. )}
); }